package day_8_14;

/**
 * https://leetcode.cn/problems/game-of-life/?envType=study-plan-v2&envId=top-interview-150
 * 289. 生命游戏
 */
public class Main3 {
    int[] dx = {-1,1,0,0,-1,-1,1,1};
    int[] dy = {0,0,-1,1,-1,1,-1,1};

    public void gameOfLife(int[][] board) {
        // 1 代表的是现在存活以后也是或者的
        // 0 代表的是现在死了以后还是死的
        // -1 代表的是过去是活的现在是死的
        // 2 代表的是过去是死的现在是活的
        int rows = board.length;
        int cols = board[0].length;

        // 遍历每一个格子里的细胞
        for(int row = 0;row < rows;row++) {
            for(int col = 0;col < cols;col++) {
                // 对于每一个细胞统计其八个相邻位置里的活细胞数量
                int count = 0;
                for(int k = 0;k < 8;k++) {
                    int x = row + dx[k];
                    int y = col + dy[k];
                    // 这里进行统计的是初始的board的状态
                    if(x >= 0 && x < rows && y >= 0 && y < cols && (Math.abs(board[x][y]) == 1)) {
                        // 是活细胞
                        count++;
                    }
                }

                // 判断
                if((board[row][col] == 1) && (count < 2 || count > 3)) {
                    board[row][col] = -1;
                }
                if(board[row][col] == 0 && count == 3) {
                    board[row][col] = 2;
                }
            }
        }

        // 转换状态
        for(int row = 0;row < rows;row++) {
            for(int col = 0;col < cols;col++) {
                if(board[row][col] > 0) {
                    board[row][col] = 1;
                }else {
                    board[row][col] = 0;
                }
            }
        }
    }

    public void gameOfLife1(int[][] board) {
        // 使用另一个数组
        int rows = board.length;
        int cols = board[0].length;

        // 复制一个数组，进行判断来更改board
        int[][] copyBoard = new int[rows][cols];

        for(int row = 0;row < rows;row++) {
            for(int col = 0;col < cols;col++) {
                copyBoard[row][col] = board[row][col];
            }
        }

        // 遍历每一个格子里的细胞
        for(int row = 0;row < rows;row++) {
            for(int col = 0;col < cols;col++) {
                // 对于每一个细胞统计其八个相邻位置里的活细胞数量
                int count = 0;
                for(int k = 0;k < 8;k++) {
                    int x = row + dx[k];
                    int y = col + dy[k];
                    if(x >= 0 && x < rows && y >= 0 && y < cols && copyBoard[x][y] == 1) {
                        // 是活细胞
                        count++;
                    }
                }

                // 判断
                if((copyBoard[row][col] == 1) && (count < 2 || count > 3)) {
                    board[row][col] = 0;
                }
                if(copyBoard[row][col] == 0 && count == 3) {
                    board[row][col] = 1;
                }
            }
        }
    }
}
